package com.tw.wechart2.util;

import android.content.Context;
import android.content.pm.ApplicationInfo;
import android.util.Log;

/**
 * @Description: 自定义log工具类
 * @Author: lanteng 2020/9/15
 * @Version: 1.0
 */
public class MyLogUtils {
    // 日志打印实例
    private static MyLogUtils instance;
    // 未定义tag时使用该tag打印日志
    private String TAG = "TW_TAG";
    // log过多时只能打印一部分, 需要分批打印, 此处定义一次打印的log长度(最大长度为4k byte, utf格式下一个汉字占3个字节, 按全部汉字算, 取整对多一次性打印1000个汉字)
    private int MAX_LOG_LENGTH = 1 * 1000;
    // 是否是debug版本, debug版本打印log, release版本不打印log
    private boolean isDebug = true;
    // 自检模式中打开log
    private boolean isOpenPrintLog = false;

    // 私有其构造方法,禁止其他外部地方使用造成多个实例,无法统一管理
    private MyLogUtils() {

    }

    /**
     * @Description: 获取日志打印实例
     * @Author: 19041217 2020/7/25 16:12
     */
    public static MyLogUtils instance() {
        if (instance == null) {
            synchronized (MyLogUtils.class) {
                if (instance == null) {
                    instance = new MyLogUtils();
                }
            }
        }
        return instance;
    }

    /**
     * @Description: app启动时调用该方法, 检测是否是debug版本,
     * @Author: 19041217 2020/7/25 15:28
     */
    public void setDebugStatus(Context context) {
        isDebug = isApkDebugable(context);
        TAG = context.getClass().getSimpleName();
    }

    /**
     * @Description: 判断是否是debug 模式，如果是debug 打印log ，否则不打印
     * @Author: 19041217 2020/7/25 17:01
     * @param context
     */
    private boolean isApkDebugable(Context context) {
        try {
            ApplicationInfo info = context.getApplicationInfo();
            return (info.flags & ApplicationInfo.FLAG_DEBUGGABLE) != 0;
        } catch (Exception e) {
            return false;
        }
    }

    /**
     * @Description: 以下为日志打印方法
     * @Author: 19041217 2020/7/25 15:50
     */
    public void logV(String log) {
        logV(TAG, log);
    }
    public void logV(String tag, String log){
        doPrintLog(Log.VERBOSE, tag, log);
    }

    public void logD(String msg) {
        logD(TAG, msg);
    }
    public void logD(String tag, String log) {
        doPrintLog(Log.DEBUG, tag, log);
    }

    public void logI(String log) {
        logI(TAG, log);
    }
    public void logI(String tag, String log) {
        doPrintLog(Log.INFO, tag, log);
    }

    public void logW(String log) {
        logW(TAG, log);
    }
    public void logW(String tag, String log) {
        doPrintLog(Log.WARN, tag, log);
    }

    public void logE(String log) {
        logE(TAG, log);
    }
    public void logE(String tag, String log) {
        doPrintLog(Log.ERROR, tag, log);
    }

    /**
     * @Description: 日志过长时逻辑处理
     * @Author: 19041217 2020/7/25 16:09
     * @param level : 日志打印级别
     * @param tag : 日志打印tag
     * @param log : 需要打印的日志
     */
    private void doPrintLog(int level, String tag, String log) {
        if (isDebug || isOpenPrintLog) {
            // 日志内容过长时, 分批打印
            while (log.length() > MAX_LOG_LENGTH) {
                printLog(level, tag, log.substring(0, MAX_LOG_LENGTH));
                log = log.substring(MAX_LOG_LENGTH);
            }
            printLog(level, tag, log);
        }
    }

    /**
     * @Description: 根据不同日志级别打印指定级别日志
     * @Author: 19041217 2020/7/25 16:10
     * @param level : 日志打印级别
     * @param tag : 日志打印tag
     * @param log : 需要打印的日志
     */
    private void printLog(int level, String tag, String log) {
        switch (level) {
            case Log.VERBOSE: Log.v(tag, log);break;
            case Log.DEBUG: Log.d(tag, log);break;
            case Log.INFO: Log.i(tag, log);break;
            case Log.WARN: Log.w(tag, log);break;
            case Log.ERROR: Log.e(tag, log);break;
            default: Log.i(tag, log);
        }
    }
}
